package org.common.redis;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class RedisClient {

	private Jedis jedis; // 非切片客户端连接
	private JedisPool jedisPool;// 非切片连接池
	private ShardedJedis shardedJedis;// 切片客户端连接
	private ShardedJedisPool shardedJedisPool;// 切片连接池
	private final String redisUrl = "127.0.0.1";
	private final int port = 6379;

	public RedisClient() {
		initialPool();
		initialShardedPool();
		shardedJedis = shardedJedisPool.getResource();
		jedis = jedisPool.getResource();
	}

	/**
	 * 初始化非切片池
	 * 
	 * @author Mr.古
	 */
	private void initialPool() {
		// 切片池基本配置
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(20);
		config.setMaxWaitMillis(30000);
		config.setTestOnBorrow(false);
		jedisPool = new JedisPool(config, redisUrl, port);
	}

	/**
	 * 初始化切片池
	 * 
	 * @author Mr.古
	 */
	private void initialShardedPool() {
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(20);
		config.setMaxWaitMillis(30000);
		config.setTestOnBorrow(false);
		// slave链接
		List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
		shards.add(new JedisShardInfo(redisUrl, port));
		// 构造池 
        shardedJedisPool = new ShardedJedisPool(config, shards);
	}
	
	/**
	 * 清空库中所有数据
	 * @author Mr.古
	 */
	public String keyFlushDB() {
		return jedis.flushDB();
	}
	
	/**
	 * 判断key是否存在
	 * @author Mr.古
	 * @param key
	 * @return
	 */
	public boolean keyExists(String key) {
		return shardedJedis.exists(key);
	}
	
	/**
	 * 新增键值对
	 * @author Mr.古
	 * @param key
	 * @param value
	 */
	public String keySet(String key, String value) {
		return shardedJedis.set(key, value);
	}
	
	/**
	 * 获取库中所以键值
	 * @author Mr.古
	 * @return
	 */
	public Set<String> keyGetKeys(){
		return jedis.keys("*");
	}
	
	/**
	 * 获取键值
	 * @author Mr.古
	 * @param key
	 * @return
	 */
	public String keyGetKey(String key) {
		return jedis.get(key);
	}
	
	/**
	 * 删除某个key
	 * @author Mr.古
	 */
	public Long keyDel(String key) {
		return jedis.del(key);
	}
	
	/**
	 * 设置 key的过期时间
	 * @author Mr.古
	 * @return 
	 */
	public Long keyExpire(String key, int seconds) {
		return jedis.expire(key, seconds);
	}
	
	/**
	 * 移除某个key的生存时间
	 * @author Mr.古
	 * @param key
	 * @return 
	 */
	public Long keyPersist(String key) {
		return jedis.persist(key);
	}
	
	/**
	 * 查看key所储存的值的类型
	 * @author Mr.古
	 * @param key
	 * @return
	 */
	public String keyType(String key) {
		return jedis.type(key);
	}

	/**
	 * 一次性新增多个键值对
	 * @author Mr.古
	 * @return
	 */
	public String stringMget(String[] key, String[] value) {
		return null;
	}
	
	/**
	 * 删除多个key
	 * @author Mr.古
	 * @param keys
	 * @return
	 */
	public Long stringDel(String[] keys) {
		return jedis.del(keys);
	}
	
	/**
	 * 一次性获取多个key
	 * @author Mr.古
	 * @return
	 */
	public String stringMget() {
		return null;
	}
	
	/**
	 * redis新增list
	 * @author Mr.古
	 * @param key
	 * @param value
	 * @return
	 */
	public Long listLpush(String key, String... value) {
		return shardedJedis.lpush(key, value);
	}
	
	
//	public static void main(String[] args) {
//		Jedis jedis = new Jedis("127.0.0.1");
//		System.out.println("链接成功" + jedis + "======" + jedis.ping());
//		System.out.println(jedis.get("myKey"));
//	}
}
